gRPC 的请求
trailer 和 header 的区别
在一个测试代码中看到如下的内容
client := apis.NewGreeterClient(conn)
var header, trailer metadata.MD
resp, err := client.Hello(context.TODO(), &apis.HelloRequest{
Message: "hi",
}, grpc.Header(&header), grpc.Trailer(&trailer))
if err != nil {
panic(err)
}
可以看到发送 matedata 有两种方式 一种是通过 Header,另外一种是 Trailer。
既然可以通过 Header 发送元数据,为什么还需要通过 Trailer 发送呢?这两个的区别和联系是什么呢?
首先,我们需要知道 grpc 通信模式分为四种
- 一元RPC模式
- 服务器流RPC模式
- 客户端流RPC模式
- 双向流RPC模式
看 一元RPC模式 和 双向流RPC模式 的区别
一元RPC模式通过一发一收模式
客户端消息由 头部-内容1-EOS 构成,服务端消息由 头部-内容1-trailer 构成
双向流RPC模式通过多发多收模式
客户端消息由 头部-内容3-内容1-内容2-EOS 构成,
服务端消息由 头部-内容1-内容2-内容3-trailer
可以看出,在一元模式中,header 和 trailer 是一起到达客户端的,此时客户端从 header 或者 trailer 中获取 metadata 是一样的
但是在流模式中,header 是先到达,然后接收多个 stream 内容,最后才获取到 trailer,获取的时机是不一样的,所以 grpc 提供了两种方式让我们发送 metadata